Глава 5
Сто лет не писал в дневнике. Теперь придется писать снова. Удобная это штука - дневник.
Проблема такая: Считываем из исходного файла данные побайтно в массив символов в памяти компа. Как известно символы занимают один байт (АВ:а это кстати два 16-ричных символа, а не один!). Надо сделать так, чтобы каждый символ (фактически каждый байт) был представлен в виде hex-кода. Или в виде двоичного кода. Это позволило бы данные двоичных файлов представлять в hex-виде и печатать в таком виде в текстовый файл для изучения. Эту работу фактически делает программа Hackers View. Но она не распечатывает дамп в текстовый файл.
Работал над переводом в формат html-главы 4 "Thinking in C++" Брюса Эккеля. Потоки ввода-вывода. Файловые потоки ввода-вывода.
Так же тестировал все программы из этой главы. Относящиеся к файловым потокам. Глава интересная.
23:03 23.10.2008
Переводил книгу Фельдмана "Системное программирование" в html-формат. Эта книга взята из файла Владислава Пирогова. И находится пока в его же книге. Смотри Язык скриптов/My_HTML_Project/Языки программирования/Язык Ассемблер/Пирогов_статьи.
В книге 20 глав, 10 лабораторных работ. Лучше оформить ее как отдельную книгу.
Чтение из файла в память, чтение из памяти в файл. Перевод 16-ричного числа в двоичный вид. Еще далеко до того, чтобы я мог свободно выполнять эти действия в моих программах.
Все-таки изучать ассемблер надо через примеры.
7:14 24.10.2008
Сегодня начал читать более осмысленно книгу Джордейна "Справочник программиста", Глава 3 "Клавиатура". И здесь нашел исчерпывающий материал на эту тему. Хороший справочник! Читать и еще раз читать! Обращаться. В этом справочнике постоянно идет ссылка на "железо" компа. Это хорошо. И примеры на трех уровнях - высоком, среднем и низком. Средний и низкий уровень - это ассемблер. Высокий - как правило язык-basic.
9:16 25.10.2008
Есть такая небольшая программа у Калашникова: пользователь вводит символы с клавиатуры (нажимает на клавиши) а программа напрямую выводит эти символы в видеобуфер и с него на экран. Программа написана на ассемблер.
Задача следующая:
1. Сделать так, чтобы вводимые символы попадали в сегмент память данных в компе. Чтобы их можно было посмотреть через отладчик. (Задача решена см. запись 9:15 26.10.2008 дневника)
2. Сделать так, чтобы вводимые символы попадали в текстовый файл, который надо предварительно открыть для записи естественно.(Задача решена см. запись 15:58 26.10.2008 дневника)
Далее если сделать программу резидентной, то можно будет отслеживать какие клавиши нажимает пользователь, работая с программой допустим calculator.exe.
3. Написать функцию, которая выводит на экран строку символов в режиме напрямую через видеобуфер. Выводимую строку передавать как аргумент через регистр. Атрибут - цвет символа задается программно. (Задача решена: Вариации на тему Калашникова/Вар_гл_12/Prog06.)
Для решения обратимся к гл 12 Калашникова. Нужный алгоритм там есть, надо оформить его в виде функции.
Теперь обращаю внимание на программу Листинг 12 Калашникова. Функция 88h прерывания 10. Перехват этого прерывания именно с этой функцией. Но я тут могу использовать алгоритм вывода на экран строки нужного цвета. Строка должна быть в DS:SI. Посимвольный вывод строки пока не встретится символ 0 (конец строки). Этот вывод в метке Next_test программы. Причем предварительно экран очищается (забивается пробелами). Сделай такую простую программу - просто вывод строки.
В папке "Вариации на тему Калашникова" (Папка - Книги по ассемблер/Калашников) делаю эту программу. Вариации на тему Калашникова/Вар_гл_12/Prog01.
Здесь показана работа функции: Функция 88h прерывания 10h - вывод строки
Переработал (вычленил код) программу Resid12.asm. В этом коде вывод строки на экран с нужными атрибутами(цвет) и с нужной позиции. Перед выводом строки экран очищается, выводится латиницей строка It is my string. Затем ждет нажатия клавиши. Хороший алгоритм. Можно сделать этот алгоритм функцией! И выводить нужную нам строку вызовом функции.
Кроме того в этой программе демострируется работа операторов lods и stos, rep stos. Как они в цикле символ за сомволом выводят на экран.
Функция lodsb заносит из DS:SI в al один байт, и увеличивает затем SI на единицу (инкременирует).
Функция stosw заносит по адресу ES:DI значение из AX и увеличиваем затем DI на 2. Здесь заносим слово, т.к. stosW, поэтому на два и увеличивается значение DI.
Хорошая программа!
Программа написана в одном сегменте. Все сегменты настроены на сегмент кода.
assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG
Затем перед тем как выводить строку, регистру SI передается адрес строки, которую необходимо вывести. То есть DS:SI должны указывать на выводимую строку. DS изначально у нас настроен на сегмент кода, поэтому остается в SI передать смещение (адрес строки).
mov ah,88h ;Функция 88h прерывания 10h - вывод строки (наш резидент!)
mov si,offset String ;DS:SI - указывают на строку
int 10h ;Выводим
Сделал программу Prog06, в которой вывод строки оформил как отдельную функцию (использовано прерывание 10h функция 88h). Передал аргумент (адрес строки) через DS:SI.
Перечитать еще о включаемых файлах, потому, что не получилось сделать функцию в виде отдельного включаемого модуля.
12:51 25.10.2008
Между прочим в программе Юрова Prog_14_3 из главы 14 есть функция подсчета символов в строке. Эта функция вызывается с аргуметом (строкой), адрес которой передан через DS:SI. Можно изменить эту программу, по аналогии с предыдущей нами рассмотренной программой, чтобы использовать функцию вывода строки на экран. Тогда результат подсчета будет выводиться на пустом экране желтым цветом. Вот уже две интересных функции - функция вывода и функция подсчета символов в строке.
Функция подсчета символов в строке и функция вывода строки на экран в режиме напрямую через видеобуфер. Обе эти функции использованы в программе: Вариации на тему Калашникова/Вар_гл_12/Prog13.
21:00 25.10.2008
Вопрос: как превратить двузначное упакованное число, расположенное в al, в двухзначное неупакованное число расположенное соответственно в ah и al? АВ: это неактуально на данный момент.
Назад |
Начало урока |
Вверх |
Вперед
Содержание